package ca.etsmtl.log430.lab2.presentation;

import java.util.Collection;
import java.util.HashMap;

import ca.etsmtl.log430.lab2.gestion.Teacher;
import ca.etsmtl.log430.lab2.gestion.TeacherAssignmentException;
import ca.etsmtl.log430.lab2.gestion.ifaces.ICourse;
import ca.etsmtl.log430.lab2.gestion.ifaces.ITeacher;
import ca.etsmtl.log430.lab2.gestion.ifaces.ITeacherAssignment;
import ca.etsmtl.log430.lab2.gestion.ifaces.TeacherAssignmentFactory;
import ca.etsmtl.log430.lab2.presentation.cmdline.Displays;
import ca.etsmtl.log430.lab2.presentation.wingui.JFrameDisplay;
public class Main {

	
	private static String COURSEFILE_PARAM = "courseFile";
    private static String TEACHERFILE_PARAM = "teacherFile";
    
    
	/**
	 * @param args
	 * 
	 * 		
	 *     courseFile=data\coursLOG.txt
	 *     teacherFile=data\enseignantsLOG.txt
	 * 
	 * 
	 */
	public static void main(String[] args) {
		
		

			if (args.length != 2) {
				System.out.println("\n\nIncorrect number of input parameters -"
						+ " correct usage:");
				System.out.println("\njava TeacherAssignment <course file name>"
						+ " <teacher file name>");
			} else {

				// Declarations:

				boolean done; // Loop invariant
				char userChoice; // User's menu choice
				ICourse myCourse = null; // A course object
				Teacher myTeacher = null; // A teacher object

				// Instantiates a menu object
				Menus menu; 

				// Instantiates a display object
				IDisplay display;

				/*
				 * The following instantiations create a list of courses and
				 * teachers. The pathname for the file containing course information
				 * is passed to the main program on the command line as the first
				 * argument (argv[0]). The pathname for the file containing teacher
				 * information is passed to the main program on the command line as
				 * the second argument (argv[1]). An example teacher file and course
				 * file is provided as enseignantsLOG.txt and coursLOG.txt
				 */
				HashMap<String,String> mapedArgs= new HashMap<String, String>();
				for (String string : args) {
					String[] element = string.split("=");
					mapedArgs.put(element[0], element[1]);
				};
				
				System.out.println(COURSEFILE_PARAM+":"+mapedArgs.get(COURSEFILE_PARAM));
				System.out.println(TEACHERFILE_PARAM+":"+mapedArgs.get(TEACHERFILE_PARAM));
				
				TeacherAssignmentFactory factory = new TeacherAssignmentFactory();
				
				factory.setCourseFileName(mapedArgs.get("courseFile"));
				factory.setTeacherFileName(mapedArgs.get("teacherFile"));
				
				
				ITeacherAssignment controller = factory.getTeacherAssingmentInstance();
				//display = new Displays(controller);
				display = new JFrameDisplay(controller);
				menu	= new Menus(controller);
				
				
				

				if ((controller.getListOfCourses() == null)
						|| (controller.getListOfTeachers() == null)) {
					System.out
							.println("\n\n *** The course list and/or the teacher"
									+ " list was not initialized ***");
					done = true;
				} else {
					done = false;
				} // if

				
				
				while (!done) {

					userChoice = menu.mainMenu();
					Collection<? extends ICourse> courses;
					switch (userChoice) {

					/*
					 * Option 1: 	Affiche la liste des enseignants. Les enseignants dans le syst�me sont ceux inscrits dans le 
									fichier des donn�es d'entr�e dont un exemple est fourni avec le syst�me original (fichier 
									enseignantsLOG.txt). */
					case '1': ///List Teachers

						display.displayTeacherList(controller
								.getListOfTeachers());
						break;

					/*
					* Option 2: 	Affiche la liste des cours offerts cette session. Les cours offerts sont ceux inscrits dans le 
									fichier des donn�es d'entr�e dont un exemple est fourni avec le syst�me original (fichier coursLOG.txt) 
						 */
					case '2'://List Courses

						display.displayCourseList(controller.getListOfCourses());
						break;

					/*
					 * Option 3:	 Demande � l'usager de fournir le matricule de l'enseignant. Une fois entr�, le syst�me cherche 
									 l'enseignant associ� � ce matricule et affiche la liste des cours attribu�s � cet enseignant pour la session en 
									 cours. 	
					 */
					case '3'://List courses currently assigned to a teacher this term

						display.displayTeacherList(controller
								.getListOfTeachers());
						
						myTeacher = menu.pickTeacher();
						
						
						if (myTeacher != null) {
							display.displayCoursesAssignedToTeacher(myTeacher);
						} // if
						break;

					/*
					 * Option 4: 	Demande � l'usager de fournir un sigle de cours et un groupe. Une fois ces informations 
									entr�es, le syst�me trouve le cours-groupe dans la  liste des cours et affiche les enseignants auxquels est 
									attribu� le cours-groupe. */
					case '4'://List teacher(s) currently assigned to a course this term

					
						display.displayCourseList(controller.getListOfCourses());
						
						myCourse = menu.pickCourse();

						if (myCourse != null) {
							display.displayTeachersAssignedToCourse(myCourse);
						} // if
						break;

				    /*
				     * Option 5: 	Demande � l'usager de fournir le matricule d�un enseignant, un sigle de cours et un groupe. 
									Une fois ces informations entr�es, le syst�me ajoute le cours � la liste des cours attribu�s � l'enseignant et 
									ajoute l'enseignant � la liste des enseignants assign�s � ce cours. Aucune v�rification n'est faite quant aux 
									multiples attributions de cours au m�me enseignant ou aux conflits d'horaire. 
				     */
					case '5'://Assign a teacher to a course

						display.displayTeacherList(controller
								.getListOfTeachers());
						myTeacher = menu.pickTeacher();

						if (myTeacher != null) {
							display.displayCourseList(controller
									.getListOfCourses());
							myCourse = menu.pickCourse();
							if (myCourse != null) 
							{
								try
								{
									boolean proceed=true;
									if(myCourse.getTeachers().getSize()>0)
									{
										System.out.println("Those teachers are already assinged to this course do you really whant to add an other one?");
										display.displayTeachersAssignedToCourse(myCourse);
										proceed = menu.sayYesOrNo();
									}
									if(proceed)
										controller.assignTeacherToCourse(myTeacher, myCourse);
								}
								catch(TeacherAssignmentException e)
								{
									display.displayException(e);
								}
							} // if
						} // if

						break;
						
					/*
					 * Modification 1: 	Ajouter une option qui permet aux usagers d'afficher la liste des cours (pas les 
					 *					laboratoires!) qu'un enseignant a d�j� enseign�s avant la pr�sente session. 
					 * 
					 * Option 6:	Demande a l'usager de fournir le matricule d'un enseignant.
					 * 				Affiche une liste de cours qu'un enseignant a d�j� enseign�s avant la pr�sente session.
					 * 
					 */
					case '6':// liste des cours (pas les laboratoires!)
						
						
						Collection<? extends ITeacher> teachers = controller.getListOfTeachers();
						display.displayTeacherList(teachers);
						myTeacher = menu.pickTeacher();
						display.displayTeacher(myTeacher);
						display.displaySigleList((myTeacher.getCoursesTaughtList()));
						
						break;
					
					/*
					 * Modification 2: Ajouter une option qui permet d'afficher la liste des cours (pas les laboratoires!) qui 
						n�ont pas �t� encore attribu�s cette session.  
						
						Option 7: 	Affiche une liste de cours qui n'ont pas �t� attribu�. 
						
					 */
					case '7':	
						
						 courses = controller.getUnAssignedCourses();
						 display.displayCourseList(courses);
						 break;

		
						
						
						
					case 'X':

					case 'x':
						done = true;
					} // switch
				} // while
			} // if
		} // main
		
		
		
	

}
